package cn.victory.planB;

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @ Description Jedis客户端操作Redis
 *              方式二：连接池（未抽取连接池工具）
 * @ Author victory
 * @ Date 2022/5/14
 **/
public class JedisPoolDemo {



    /**
     *  1.创建连接池配置对象
     *  2.配置连接池参数，拿到连接池配置对象
     *  3.通过连接池配置对象将参数传入，拿到连接池
     *  4.通过连接池拿到连接
     *  5.操作Redis
     *  6.释放链接
     *  7.摧毁连接池（连接池生命周期一般与我们项目一样，即项目启动时创建连接池，项目结束时摧毁连接池）
     **/
    @Test
    public void testJedisPool(){
        //1.创建连接池配置对象
        JedisPoolConfig config = getJedisPoolConfig();
        //3.通过连接池配置对象，设置参数
        JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 3000);
        //4.通过连接池获取连接
        Jedis jedisConnection = jedisPool.getResource();
        //5.执行操作
        jedisConnection.set("user", "victory");
        //6.释放连接
        jedisConnection.close();
        //7.摧毁连接池
        jedisPool.destroy();
    }

    private static JedisPoolConfig getJedisPoolConfig() {
        JedisPoolConfig config = new JedisPoolConfig();
        //2.配置连接池参数
        //2.1忙时最大连接（最大连接数）
        config.setMaxTotal(8);//连接池的最大连接数。使用负数表示无极限。
        //2.2闲时最大连接（最小连接数）
        config.setMaxIdle(2);//连接池的最大空闲连接数。如果值很小的话会频繁的创建销毁连接导致性能开销增加。
        //2.*闲时最小连接数
        config.setMinIdle(0);//连接池的最小空闲连接数。确保池满足要求在空闲对象回收运行期间的最小实例数。minIdle配置值大于配置值对于maxIdle，则将使用maxIdle的值。
        //2.3超时时间
        config.setMaxWaitMillis(3000);
        //2.4获取连接池检查时机
        config.setTestOnBorrow(true);
        return config;
    }
}
